The way in which a network connection is typically established and maintained has gaps that allow malicious entities (e.g., malicious code) to perform various attacks on unsuspecting devices and/or unsuspecting users. For instance, a single Internet Protocol (IP) address of a resource to be accessed could be hosting multiple web servers or could be a network endpoint with many types of servers and services running behind the network endpoint on a private network. Moreover, IP addresses can be loosely associated with a hostname or a domain name and/or the IP addresses associated with a resource can dynamically change (e.g., multiple times per minute in some instances).
To further complicate this issue, network components (e.g., a network stack) use IP addresses and can be agnostic to hostnames, and thus, a name-based policy applied in the network stack often cannot effectively determine whether access to an IP address should be denied or allowed (e.g., due to load balancing across different IP addresses, due to Content Delivery Networks representing many different resources via a set of IP addresses, etc.). For instance, an application can have freedom to cache its own set of destination IP addresses and then connect directly to those IP addresses without using a hostname. This can make security and/or policy enforcement difficult because the operating system is “blind” to which resources the application connects to and this hampers the ability for the operating system or other components to enforce a reliable security policy because malicious applications can circumvent a name-based policy by using IP addresses. Consequently, a host operating system has no end-to-end understanding of the information being used to establish and/or maintain a network connection to a resource. Stated another way, components of a device used to establish and maintain network connectivity do not coordinate with each other to retain the information and to provide a holistic and/or unified view into how the network connection is, or is to be, established and maintained.
Rather, the application is typically responsible for driving the coordination of these components, therefore making it impossible for the operating system to know or understand the coordination information. Thus, the operating system is unaware of the coordination. In some instances, the application can even act as a filter that prevents the operating system from obtaining and understanding this coordination information so that it can be passed down to lower levels of the operating system where enforcement can happen. This makes it difficult, or even impossible, to build an effective policy. Moreover, this makes it difficult, or even impossible, to reliably enforce a policy (e.g., a routing policy, a firewall policy, a sandboxing policy, etc.).
Furthermore, most current network connectivity is established and maintained in accordance with a single network interface. This design makes assumptions that correlate a hostname of a resource to a fixed set of IP addresses to establish connections so that information can be exchanged. This design is implemented both by network stack software and application software. It impacts network roaming, resource caching (e.g., names, IP addresses), and security enforcement. However, many mobile devices currently being used are equipped with multiple network interfaces, and therefore, these mobile devices provide new dynamics such that an application executing on a mobile device may want to establish and maintain network connection(s) with a resource while the mobile device switches between networks (e.g., from a wired network to a wireless network and vice versa, from a Wi-Fi connection to a mobile broadband connection and vice versa, etc.). Moreover, in some cases, reliability issues can arise when a network claims to have access to a resource, but it actually does not.